/*******************************************************************************
 * This file is part of blueprint4j www.blueprint4j.org.
 * 
 *     blueprint4j is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Lesser General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 * 
 *     blueprint4j is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU Lesser General Public License for more details.
 * 
 *     You should have received a copy of the GNU Lesser General Public License
 *     along with blueprint4j. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package blueprint4j.comm.io;

import blueprint4j.utils.*;

import java.io.*;
import java.util.Vector;

public class LineReaderDelimeter extends LineReader {
	private byte delimeter[] = null;
	private VectorByteArray store= new VectorByteArray();

	public LineReaderDelimeter(LineReader reader,byte delimeter[]) {
		super(reader);
		this.delimeter = delimeter;
	}

	public LineReaderDelimeter(InputStream stream,byte delimeter[]) {
		super(stream);
		this.delimeter = delimeter;
	}
	
	public byte[] getUnread() {
		if (super.getUnread() != null && super.getUnread().length > 0) {
			return ByteM.concat(ByteM.concat(store.toByteArray(delimeter),delimeter),super.getUnread());
		} else {
			return store.toByteArray(delimeter);
		}
	}
	
	protected boolean available() throws IOException {
		return store.size() > 0 || availableInTopStream() > 0;
	}

	public byte[] readBytes() throws IOException,TimeoutException {
		if (store.size() > 0) {
			return store.remove(0);
		}
		byte data[] = read();
		if (ByteM.indexOf(data,delimeter)== -1) {
			unread(data);
			markNoRead();
			return null;
		}
		for (;ByteM.indexOf(data,delimeter)!= -1;) { 
			store.add(ByteM.subbyte(data,0,ByteM.indexOf(data,delimeter)));
			data = ByteM.subbyte(data,ByteM.indexOf(data,delimeter)+delimeter.length);
		}
		unread(data);
		return readBytes();
	}
}
